package com.xzmzhp.utils.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.xzmzhp.dao.excel.ExcelMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSON;

/**
 * @author 王源(xm)
 * @Date: 2020/11/29 07:56
 * @Description: excel导入类
 */
public class UploadDataListener extends AnalysisEventListener {

    /**配置日志*/
    private static final Logger LOGGER = LoggerFactory.getLogger(UploadDataListener.class);

    /**数据保存接口*/

    private final ExcelMapper exceldb;
    /**
     * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 100;

    /**设置储存容器*/
    List<Object> list = new ArrayList<>();

    /**
     * 有参构造
     *
     * @param exceldb 数据保存接口
     */
    public UploadDataListener(ExcelMapper exceldb) {
        this.exceldb = exceldb;
    }


    @Override
    public void invoke(Object o, AnalysisContext analysisContext) {
        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(o));
        list.add(o);
        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
        if (list.size() >= BATCH_COUNT) {
            exceldb.uploadData(list);
            // 存储完成清理 list
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        exceldb.uploadData(list);
        LOGGER.info("所有数据解析完成！");
    }
}
